"""
# Author : YuuSoo
# version : python 3.8
# Time : 2023/1/7 11:46
"""
# -*- coding: utf-8 -*-
# =============================================================================
# import....
import logging
from datetime import datetime, date

import flask_restful
from flask_restful import Resource, reqparse
import numpy as np
import pandas as pd
import time

import json
import utils

# 自定义模块

from errors import my_abort, generate_response, ResponseCode


# 自定义错误
flask_restful.abort = my_abort #abort 方法用于在 API 中处理异常情况时返回错误响应，通过重新指向可以使用自定义的异常处理逻辑。
root_logger = logging.getLogger('root')  #创建了一个名为 'root' 的日志记录器，用于记录 Flask 应用的根日志信息
logger = logging.getLogger('main')       #码创建了一个名为 'main' 的日志记录器，用于记录应用特定的日志信息。这个日志记录器一般用于记录应用自身的操作和信息。
# =============================================================================

# =============================================================================
# 模型import
from .KnowGra_construction import function


# =============================================================================


class GJ_KnowGra_construction(Resource):
    def __init__(self):
        # Authorization, fileId
        self.parser = reqparse.RequestParser(bundle_errors=True)
        self.parser.add_argument('Authorization', type=str, required=True, help="需要数据文件绝对路径")
        self.parser.add_argument('fileId', type=str, required=True, help="需要数据文件绝对路径")
        self.parser.add_argument('Company', type=str, required=True, help="公司")
        self.parser.add_argument('Temperature_num', type=str, required=True, help="输入温区数量")

    # def get(self):
    #     currentTimeStr = utils.nowTimeText4China()
    #     print('=== 工艺参数推荐开始, 中国时间: %s' % currentTimeStr)
    #
    #     computeDurationStart = time.time()
    #     httpStatusCode = 200
    #     queryParams = self.parser.parse_args()
    #     # 获取参数，根据参数需求增删
    #
    #     logger.info(
    #         '=== 工艺参数推荐请求 ==> GET ')
    #     res = function()
    #
    #     if res['resp_code'] == ResponseCode.WRONG_PARAM:
    #         httpStatusCode = 400
    #     computeDuration = time.time() - computeDurationStart
    #     logger.info('=== 工艺参数推荐 ==> 耗时( %.3f 秒 )' % computeDuration)
    #     return res, httpStatusCode, {"Content-Type": "application/json; charset=utf-8"}

    def post(self):
        currentTimeStr = utils.nowTimeText4China()                   #获取当前中国时间的字符串表示。
        print('=== 知识库构建开始, 中国时间: %s' % currentTimeStr)

        computeDurationStart = time.time()                            #计算处理请求的耗时
        httpStatusCode = 200
        # Authorization, fileId
        queryParams = self.parser.parse_args()                       #self.parser 解析了客户端发送的请求参数。parse_args() 方法会解析请求中的参数，并返回一个包含解析结果的字典。
        # 获取参数，根据参数需求增删
        Authorization = queryParams.get('Authorization')
        fileId = queryParams.get('fileId')
        Company = queryParams.get('Company')
        Temperature_num = queryParams.get('Temperature_num')

#请求处理过程中的日志信息，包括请求方法、请求参数等信息。这样可以方便后续查看和分析日志
        logger.info(
            '=== 知识库构建请求 ==> POST ?\nAuthorization=%s\nfileId=%s\nCompany=%s\nTemperature_num=%s' % (Authorization, fileId,Company,Temperature_num))
        res = function(Authorization, fileId,Company,Temperature_num)

        if res['resp_code'] == ResponseCode.WRONG_PARAM:
            httpStatusCode = 400
        computeDuration = time.time() - computeDurationStart         #计算了处理请求的耗时，用当前时间戳减去处理开始时的时间戳。
        logger.info('=== 知识库构建 ==> 耗时( %.3f 秒 )' % computeDuration)
        return res, httpStatusCode, {"Content-Type": "application/json; charset=utf-8"}  #返回了处理结果、HTTP 状态码和响应头部信息。其中，响应头部信息指定了返回的数据类型为 JSON 格式，并设置了字符集为 UTF-8。


class NpEncoder(json.JSONEncoder):  # 继承json.JSONEncoder
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.float):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, pd.Timestamp):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        elif isinstance(obj, np.datetime64):
            return np.datetime_as_string(obj)
        else:
            return super(NpEncoder, self).default(obj)
